package main

import (
	"encoding/json"
	"fmt"
	"gorm.io/gorm"
)

type Organ struct {
	Id            string //组织ID
	Name          string //组织名
	Description   string //组织描述
	AdminUsername string //组织管理员用户名
}

type User struct {
	OrgId    string `json:"orgId"`    // 所属组织ID
	Username string `json:"username"` //用户名
	Password string `json:"password"` //密码
}
type Vote struct {
	Id          string           `json:"id"`          //投票ID
	Name        string           `json:"name"`        //投票名称
	Img         string           `json:"img"`         //投票封面地址
	Description string           `json:"description"` //投票描述
	OrgId       string           `json:"orgId"`       //发起组织ID
	BeginTime   int64            `json:"beginTime"`   //开始时间
	EndTime     int64            `json:"endTime"`     //截至时间
	Voters      map[string]Voter `json:"voters"`      //候选人列表
	VotedUser   map[string]int   `json:"votedUser"`   //已经进行投票的用户id
}

func (v *Vote) toBytes() (*SavedVote, error) {
	fmt.Println(v.VotedUser)
	voters, err := json.Marshal(v.Voters)
	if err != nil {
		return &SavedVote{}, err
	}
	votedUsers, err := json.Marshal(v.VotedUser)
	if err != nil {
		return &SavedVote{}, err
	}
	return &SavedVote{
		Id:        v.Id,
		Name:      v.Name,
		Img:       v.Img,
		OrgId:     v.OrgId,
		BeginTime: v.BeginTime,
		EndTime:   v.EndTime,
		Voters:    voters,
		VotedUser: votedUsers,
	}, nil
}

// SavedVote 将投票结构体转化为数据库可以存储的格式
type SavedVote struct {
	gorm.Model
	Id          string `gorm:"primaryKey"` //投票ID
	Name        string
	Img         string
	OrgId       string `gorm:"index"` //发起组织ID
	Description string //投票描述
	BeginTime   int64  //开始时间
	EndTime     int64  //截至时间
	Voters      []byte
	VotedUser   []byte
}
type Voter struct {
	Id          string `json:"id"`          //候选人ID
	Name        string `json:"name"`        //候选人名称
	Description string `json:"description"` //候选人描述
	Img         string `json:"img"`         //候选人面部图片base64编码后的字符串
	Numbers     int    `json:"numbers"`     //候选人所得票数
}

// Login 登录数据
type Login struct {
	OrgId    string `json:"orgId"`    //所登录组织ID
	IsAdmin  bool   `json:"isAdmin"`  //是否作为管理员登录
	Username string `json:"username"` //用户名
	Password string `json:"password"` //密码
}

// DoVote 投票数据
type DoVote struct {
	Id      string `json:"id"`      //所选投票ID
	VoterId string `json:"voterId"` //所选候选人ID
	Token   string `json:"token"`   //用户登录后获得的Token
}

// GetVoteData 请求查看投票数据
type GetVoteData struct {
	Id    string //所选投票ID
	Token string //用户登录后获得的Token
}

type DBConfig struct {
	Mysql struct {
		Username string `json:"username"`
		Password string `json:"password"`
		Address  string `json:"address"`
		Port     string `json:"port"`
		DBname   string `json:"dbname"`
	} `json:"mysql"`
}

type Result struct {
	Code int
	Data string
}
type OrgRegData struct {
	Organ
	AdminPassword string
}
